﻿ /*
  頁面元素收發插件
  Create by alan
  vision:1.0
  物件元素支援類型：text,radio,select,checkbox,textarea
 */
 (function($)
 {
 	$.extend($.fn, 
 	{
 	    //入口
		MyForm:function(options) 
		{
		    //傳入參數定義
		    var op = $.extend({type:"get",                     //操作類型：(get)取值,(set)賦值
		                       datatype:"json",              //數據類型：(text)字符串,(json)JSON,(array)數組
		                       data:null,                      //傳入數據：用於賦值,可為:Text、JSON、Array
		                       model:"main",                   //模式：(main)主檔模式 (item)明細檔模式
		                       query:"[isfield='true']",      //選擇器過濾條件
		                       itemquery:"tr[rowitem='true']" //明細檔選擇器過濾條件
		                       },                 //執行結果
		                       options);
		    
		    //返回JSON定義
		    var retdata = {notnull:false, formcheck:false, success:false, message:"", data:[]};
		    
		    //主檔模式
		    if(op.model == "main")
		    {
		       op.itemquery = $(this);
		    }		    
		    
		    var items = $(op.itemquery,this);
		    
		    items.each(function(i)
	        {
	            var $this = $(this);
	            var fields = $(op.query,this);
	            if(op.type == "get")
	            {
	                retdata = fields.GetFields(op,retdata,i);
	            }
	            else if(op.type == "set")
	            {
	                retdata = fields.SetFields(op,retdata);
	            }
	        });	
		        
		    //回調函數   		        
		    if (op.fn != null) 
	            op.fn.apply(this, [retdata]);	 
	            
	        if(op.datatype == "text")
	            return JSON.stringify(retdata);
	        return retdata;
		},	
		GetFields:function(op,retdata,i) //取值入口
		{	    
		    var data = {};
		    var arr = new Array();  
		    $(this).each(function() 
            {      
                var val = $(this).GetVal();   
                data[$(this).attr("fieldname")] = val;
                arr.push(val); 
                
                retdata = $(this).Check(retdata,val);
            });	
            if(op.datatype == "array")
                retdata.data[i] = arr;
            else
                retdata.data[i] = data;
            return retdata
		},		
		SetFields:function(op,retdata) //賦值入口
		{	
			if(op.data == null)
			{
			    retdata.message = "來源資料為null";
			    return;
			}	
			var jsondata = null;
			if(op.data[0]!=null && op.data[0]!="undefined")
			    jsondata = op.data[0];
		    else
			    jsondata = op.data;	
				    
			var val;			
			$(this).each(function(i) 
	        { 
	            if(op.datatype == "array")
	                val = op.data[i]
	            else if(op.datatype == "json")
	                val = $.trim(jsondata[$(this).attr("fieldname")]);
	            else
	                retdata.message = "沒有定義數據類型";
			    $(this).SetVal(val);
	        });	
	        retdata.success = true;
		    return retdata;
		},
		Check:function(retdata,val) //form表單驗證
		{
		    if($(this).hasClass("required")) //判斷為空
        	{    
            	if($.trim(val).length == 0)
            	{
            		retdata.notnull = true;
            		retdata.message = "'請注意必填字段不能為空！";
            	}
        	}
        	return retdata;
		},
		GetVal:function()  //物件元素取值
		{
		    var fieldval = "";
		    var $this = $(this);                  
            if($this.is("input"))
            {
                if($this.attr("type") == "text")
                {
                	fieldval = $this.val();
				}
				else if($this.attr("type") == "radio")
				{
				   if($this.prop("checked"))
				   {
					   fieldval = $this.attr("value");
				   }					   
			    }
				else if($this.attr("type") == "checkbox")
				{
				   if($this.prop("checked"))
				   {
					   fieldval = $this.attr("checkedvla");
				   }
				   else
				   {
					   fieldval = $this.attr("uncheckedvla");
				   }
				}     
				else
				{
					fieldval = $this.val();
				}					    
            }
            else if($this.is("select"))
            {                	
            	if($this.attr("datatype") == "text")
        		{
            		fieldval = $this.find('option:selected').text();
        		}                		
            	else
        		{
            		fieldval = $this.val();
        		}                		
            }
            else
            {
            	fieldval = $this.val();
            }
            return fieldval;                
		},		
		SetVal:function(keyvalue) //物件元素賦值
		{
		    $this = $(this);
		    if($this.is("input"))				
			{	
			    if($this.attr("type") == "text")
				   $this.val(keyvalue);
				else if($this.attr("type") == "radio")
				{
				   if($this.attr("value") == keyvalue)
				       $this.attr("checked",true);
				}
				else if($this.attr("type") == "checkbox")
				{
				   if($this.attr("value") == keyvalue)
				       $this.attr("checked",true);
				}						  
				else
				   $this.val(keyvalue);						    
			}
			else if($this.is("select"))
            {                	
            	if($this.attr("datatype") == "text")
            		$this.find("option").text(keyvalue);
            	else
            		$this.val(keyvalue); 
            }
            else
            	$this.val(keyvalue);
		}	
	});
})(jQuery);